#ifndef __ELERATOR_H
#define __ELERATOR_H
#include "stm32f4xx_hal.h"
#include "usart.h"
#include "man_crc16.h"
namespace man{
	
	typedef enum {
		WAIT_OPEN=0,ENTERING_ELEVATOR,LEAVE_ELEVATOR,SET_FLOOR,REACHED_FLOOR,
		WAIT_REACHED,FINISHED
	}ElevatorStatus;
	enum{
		UP,DOWN
	};
	
	/*
	DIN:离散输入寄存器
	COIL:线圈寄存器
	*/
	
	typedef enum {
			COIL_REG_OPEN=0,COIL_REG_COLSE,
			COIL_REG_FLOOR_1,COIL_REG_FLOOR_2,COIL_REG_FLOOR_3,COIL_REG_UP,COIL_REG_DOWN,
		
			DIN_REG_OPEN=0,DIN_REG_FLOOR_1,DIN_REG_FLOOR_2,DIN_REG_FLOOR_3
	}Register;
	class Elevator{
		
		public:
			Elevator(uint8_t id);		
		private:
			void open(uint8_t id);//发送开门指令
			void close(uint8_t id);//发送关门指令
			void setFloor(uint8_t id,uint8_t floor);//在电梯内 进行设置楼层
			void callElevator(uint8_t id,int8_t dir);//呼叫电梯到指定楼层。
			void resetElevatorReg(uint8_t id,Register coilReg);
		
			bool hasReachedTargetFloor();//发送询问是否到楼指令
			bool hasOpenedDoor();//发送询问是否开好门指令。
			bool hasEnternElevator();//判断是否进入电梯
			bool hasLeaveElevator();//判断是否离开电梯
			
			uint32_t abs(int num);
		private:
			bool isTargetFloorSet_;//判断是否设置了 目标楼层
			ElevatorStatus elevatorStatus;//默认等待开门
			uint8_t elevatorID;//哪一个电梯
			bool isCalled;//判断是否呼叫过
			bool isFirstEntry;//用于判断是不是第一次进入这个case
		public:
			//以下变量中断中有使用到。
			bool isOpenedDoor;//判断是否开好了门 标志位 
			bool isReachedTargetFloor;//判断是否到达了目标楼层标志位 
			bool isNeedElevator;//判断是否需要电梯
			bool isEnterElevator;//判断是否进入电梯
			bool isLeaveElevator;//判断是否离开电梯 有进才有走。
		
			uint16_t currentQueryAddress;//当前询问的寄存器
			uint8_t floor;//去目标楼层
			uint8_t currentFloor;//呼叫电梯到当前楼层
			uint32_t countTime;
		public:
			void init();//进行配置初始化
			void controlElevator();//整体控制电梯
			void resetElevator();//重置电梯
			void test();
	};
}
extern man::Elevator elevator_1;//电梯对象1
extern man::Elevator elevator_2;//电梯对象2
extern uint8_t msgArr[15];
#endif
